package com.xja.utils;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.JWTValidator;
import cn.hutool.jwt.signers.JWTSigner;
import cn.hutool.jwt.signers.JWTSignerUtil;

/**
 * JWT 工具类
 * @author caijg
 */
public class JwtUtils {
    /**
     * 密钥（盐）
     */
    private static final String KEY = "caijg03";

    private static final JWTSigner SIGNER =JWTSignerUtil.hs256(KEY.getBytes());

    /**
     * 生成 JWT token
     *
     * @param userId 用户ID
     * @return token字符串
     */
    public static String createToken(Long userId, int expireTime, DateField unit) {
        return JWT.create()
                .setExpiresAt(DateUtil.date().offset(unit, expireTime))
                .setPayload("userId", userId)
                .setSigner(SIGNER)
                .sign();
    }

    /**
     * 验证 token
     *
     * @param token JWT token
     * @return 是否有效
     */
    public static JWT verify(String token) {
        // 1.jwt解析
        JWT jwt = JWTUtil.parseToken(token);
        // 2.jwt验证
        JWTValidator.of(jwt)
                .validateAlgorithm(SIGNER)
                .validateDate();
        return jwt;
    }

    /**
     * 验证并且从 token 中获取用户ID
     *
     * @param token JWT token
     * @return 用户ID
     */
    public static Long verifyAndGetUserId(String token) {
        JWT jwt = verify(token);
        return Long.parseLong(jwt.getPayload().getClaim("userId").toString());
    }
}